package com.lin.mr.maizilaundry.view;

import android.content.Context;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.graphics.Canvas;
import android.graphics.Paint;
import android.util.AttributeSet;
import android.util.Log;
import android.view.MotionEvent;
import android.view.View;

/**
 * 自定义开关
 * @author poplar
 *
 * Android 的界面绘制流程
 * 测量			 摆放		绘制
 * measure	->	layout	->	draw
 * 	  | 		  |			 |
 * onMeasure -> onLayout -> onDraw 重写这些方法, 实现自定义控件
 *
 * onResume()之后执行
 *
 * View
 * onMeasure() (在这个方法里指定自己的宽高) -> onDraw() (绘制自己的内容)
 *
 * ViewGroup
 * onMeasure() (指定自己的宽高, 所有子View的宽高)-> onLayout() (摆放所有子View) -> onDraw() (绘制内容)
 */
public class SwitchView extends View {
    private Paint paint;//画笔
    private Bitmap switchBackgroudBitmap;//背景图片
    private Bitmap slideButtonBitmap;//滑块图片
    private boolean mSwitchState = false;//开关状态
    private float currentX;
    private OnSwitchStateUpdateListener onSwitchStateUpdateListener;

    /**
     * 用于代码创建控件
     * @param context
     */
    public SwitchView(Context context) {
        super(context);
    }

    /**
     *用于在xml里使用, 可指定自定义属性
     * @param context
     * @param attrs
     */
    public SwitchView(Context context, AttributeSet attrs) {
        super(context, attrs);
        init();
        //获取配置的自定义属性
        String nameSpace = "http://schemas.android.com/com.lin.mr.maizilaundry";
        int switchBackgroundResource = attrs.getAttributeResourceValue(nameSpace,"switch_background",-1);
        int slideButtonResource = attrs.getAttributeResourceValue(nameSpace,"slide_button",-1);

        mSwitchState = attrs.getAttributeBooleanValue(nameSpace,"switch_state",false);
        setSwitchBackgroundResource(switchBackgroundResource);
        setSlideButtonResource(slideButtonResource);
    }

    /**
     * 用于在xml里使用, 可指定自定义属性, 如果指定了样式, 则走此构造函数
     * @param context
     * @param attrs
     * @param defStyleAttr
     */
    public SwitchView(Context context, AttributeSet attrs, int defStyleAttr) {
        super(context, attrs, defStyleAttr);
        init();
    }

    public void init(){
        paint = new Paint();
    }

    /**
     * 设置背景图
     * @param switchBackground
     */
    public void setSwitchBackgroundResource(int switchBackground) {
        switchBackgroudBitmap = BitmapFactory.decodeResource(getResources(), switchBackground);
    }

    /**
     * 设置滑块图片资源
     * @param slideButton
     */
    public void setSlideButtonResource(int slideButton) {
        slideButtonBitmap = BitmapFactory.decodeResource(getResources(), slideButton);
    }

    /**
     * 设置开关状态
     * @param mSwitchState
     */
    public void setSwitchState(boolean mSwitchState) {
        this.mSwitchState = mSwitchState;
    }

    //设置自定义控件的宽高
    @Override
    protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
        super.onMeasure(widthMeasureSpec, heightMeasureSpec);
        setMeasuredDimension(switchBackgroudBitmap.getWidth(),switchBackgroudBitmap.getHeight());
    }

    //Canvas:画布，在上面绘制的内容会显示到界面上
    @Override
    protected void onDraw(Canvas canvas) {
        //1.绘制背景
        canvas.drawBitmap(switchBackgroudBitmap,0,0,paint);
        //2.绘制滑块
        if (isTouchMode){
            //根据当前用户触摸到的位置画滑块
            //让滑块向左移动自身一半大小的位置
            //currentX表示的是用户手指按下的位置的x坐标，用户通常按下的是滑块的中部，而绘制滑块的x坐标是从最左侧开始的，所以
            //绘制坐标等于
            float newLeft = currentX - slideButtonBitmap.getWidth()/2.0f;
            float maxLeft = switchBackgroudBitmap.getWidth()-slideButtonBitmap.getWidth();

            //限定滑块范围
            if (newLeft < 0){
                newLeft = 0;//左边范围
            }else if (newLeft > maxLeft){
                newLeft = maxLeft;//右边范围
            }
            canvas.drawBitmap(slideButtonBitmap,newLeft,0,paint);
        }else {
            //根据开关状态的boolean，直接设置图片位置
            if (mSwitchState){ //开关为开时
                //开关为开时，滑块滑动的距离是背景宽度减去滑块宽度
                int newLeft = switchBackgroudBitmap.getWidth()-slideButtonBitmap.getWidth();
                canvas.drawBitmap(slideButtonBitmap,newLeft,0,paint);
            }else {
                canvas.drawBitmap(slideButtonBitmap,0,0,paint);
            }
        }
    }

    boolean isTouchMode = false;
    //重写触摸事件，响应用户的触摸
    @Override
    public boolean onTouchEvent(MotionEvent event) {
        switch (event.getAction()){
            case MotionEvent.ACTION_DOWN:
                isTouchMode = true;
                currentX = event.getX();
                Log.e("onTouchEvent","ACTION_DOWN:"+event.getX()+"");
                break;
            case MotionEvent.ACTION_MOVE:
                isTouchMode = true;
                currentX = event.getX();
                Log.e("onTouchEvent","ACTION_MOVE:"+event.getX()+"");
                break;
            case MotionEvent.ACTION_UP:
                isTouchMode = false;
                currentX = event.getX();
                float center = switchBackgroudBitmap.getWidth() / 2.0f;
                //根据当前按下的位置和控件中心的位置进行比较
                boolean state = currentX > center;

                //如果开关状态变化了，通知界面，开关状态更新了
                if(state != mSwitchState && onSwitchStateUpdateListener != null){
                    onSwitchStateUpdateListener.onStateUpdate(state);
                }
                mSwitchState = state;
                break;
            default:
                break;
        }
        //重绘界面
        invalidate();//会引发onDraw被调用，里面的变量会重新生效，界面会更新
        return true;
    }

    //滑块状态改变时的接口监听事件
    public interface OnSwitchStateUpdateListener{
        //状态回调，把当前状态传递出去
        void onStateUpdate(boolean state);
    }
    public void setOnSwitchStateUpdateListener(
            OnSwitchStateUpdateListener onSwitchStateUpdateListener) {
        this.onSwitchStateUpdateListener = onSwitchStateUpdateListener;
    }

}
